package com.atguigu.lease.web.admin.controller.login;


import com.atguigu.lease.common.context.LoginUser;
import com.atguigu.lease.common.context.LoginUserContext;
import com.atguigu.lease.common.result.Result;
import com.atguigu.lease.common.utils.JwtUtil;
import com.atguigu.lease.model.entity.SystemUser;
import com.atguigu.lease.web.admin.service.LoginService;
import com.atguigu.lease.web.admin.service.SystemUserService;
import com.atguigu.lease.web.admin.vo.login.CaptchaVo;
import com.atguigu.lease.web.admin.vo.login.LoginVo;
import com.atguigu.lease.web.admin.vo.system.user.SystemUserInfoVo;
import io.jsonwebtoken.Claims;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@Tag(name = "后台管理系统登录管理")
@RestController
@RequestMapping("/admin")
//@CrossOrigin //解决跨域
public class LoginController {


    @Autowired
    private LoginService loginService;
    @Autowired
    private SystemUserService systemUserService;


    @Operation(summary = "获取图形验证码")
    @GetMapping("login/captcha")
    public Result<CaptchaVo> getCaptcha() {
        CaptchaVo captchaVo = loginService.getCaptcha();
        return Result.ok(captchaVo);
    }

    @Operation(summary = "登录")
    @PostMapping("login")
    public Result<String> login(@RequestBody LoginVo loginVo) {
        String token = loginService.login(loginVo);
        return Result.ok(token);
    }

    @Operation(summary = "获取登陆用户个人信息")
    @GetMapping("info")
    public Result<SystemUserInfoVo> info(@RequestHeader("access_token")  String token) {
        //获取当前登录用户的id和name
        LoginUser loginUser = LoginUserContext.getLoginUser();
        //通过id在数据库中搜索当前用户信息
        SystemUser systemUser = systemUserService.getById(loginUser.getUserId());
        //将其中的姓名和头像字符串赋值给需要返回的对象中
        return Result.ok(new SystemUserInfoVo(systemUser.getUsername(),systemUser.getAvatarUrl())); //方法一:
//        //获取请求头的token
//        Claims claims = JwtUtil.parseToken(token);
//        //获取token中用户的id
//        Long userId = claims.get("userId", Long.class);
//        //获取name
//        String username = claims.get("username", String.class);
//        //通过id来查找数据库中所对应的用户
//        SystemUser systemUser = systemUserService.getById(userId);
//        //创建SystemUserInfoVo对象
//        SystemUserInfoVo systemUserInfoVo = new SystemUserInfoVo();
//        //将查到的数据分别赋值给SystemUserInfoVo
//        systemUserInfoVo.setName(systemUser.getName());
//        systemUserInfoVo.setAvatarUrl(systemUser.getUsername());
//        //返回SystemUserInfoVo对象
//        return Result.ok(systemUserInfoVo);
        /*方法二:
            因为在浏览器中一次完整的请求都是由同一个线程所处理的，因此可以在拦截器中去读取token中的数据
            步骤:在拦截器中将获取到的token解析封装成LoginUser对象然后保存到ThreadLocal的静态对象中
                之后在任何地方需要访问当前登录的用户信息都可以通过ThreadLocal.get()方法来获取LoginUser对象
                在当前线程执行完毕后，会自动删除掉保存的用户信息
         */

    }
}